fotoramaVersion='4.6.3'; (function (window, document, location, $, undefined){ "use strict"; var _fotoramaClass='fotorama', _fullscreenClass='fullscreen', wrapClass=_fotoramaClass + '__wrap', wrapCss2Class=wrapClass + '--css2', wrapCss3Class=wrapClass + '--css3', wrapVideoClass=wrapClass + '--video', wrapFadeClass=wrapClass + '--fade', wrapSlideClass=wrapClass + '--slide', wrapNoControlsClass=wrapClass + '--no-controls', wrapNoShadowsClass=wrapClass + '--no-shadows', wrapPanYClass=wrapClass + '--pan-y', wrapRtlClass=wrapClass + '--rtl', wrapOnlyActiveClass=wrapClass + '--only-active', wrapNoCaptionsClass=wrapClass + '--no-captions', wrapToggleArrowsClass=wrapClass + '--toggle-arrows', stageClass=_fotoramaClass + '__stage', stageFrameClass=stageClass + '__frame', stageFrameVideoClass=stageFrameClass + '--video', stageShaftClass=stageClass + '__shaft', grabClass=_fotoramaClass + '__grab', pointerClass=_fotoramaClass + '__pointer', arrClass=_fotoramaClass + '__arr', arrDisabledClass=arrClass + '--disabled', arrPrevClass=arrClass + '--prev', arrNextClass=arrClass + '--next', arrArrClass=arrClass + '__arr', navClass=_fotoramaClass + '__nav', navWrapClass=navClass + '-wrap', navShaftClass=navClass + '__shaft', navDotsClass=navClass + '--dots', navThumbsClass=navClass + '--thumbs', navFrameClass=navClass + '__frame', navFrameDotClass=navFrameClass + '--dot', navFrameThumbClass=navFrameClass + '--thumb', fadeClass=_fotoramaClass + '__fade', fadeFrontClass=fadeClass + '-front', fadeRearClass=fadeClass + '-rear', shadowClass=_fotoramaClass + '__shadow', shadowsClass=shadowClass + 's', shadowsLeftClass=shadowsClass + '--left', shadowsRightClass=shadowsClass + '--right', activeClass=_fotoramaClass + '__active', selectClass=_fotoramaClass + '__select', hiddenClass=_fotoramaClass + '--hidden', fullscreenClass=_fotoramaClass + '--fullscreen', fullscreenIconClass=_fotoramaClass + '__fullscreen-icon', errorClass=_fotoramaClass + '__error', loadingClass=_fotoramaClass + '__loading', loadedClass=_fotoramaClass + '__loaded', loadedFullClass=loadedClass + '--full', loadedImgClass=loadedClass + '--img', grabbingClass=_fotoramaClass + '__grabbing', imgClass=_fotoramaClass + '__img', imgFullClass=imgClass + '--full', dotClass=_fotoramaClass + '__dot', thumbClass=_fotoramaClass + '__thumb', thumbBorderClass=thumbClass + '-border', htmlClass=_fotoramaClass + '__html', videoClass=_fotoramaClass + '__video', videoPlayClass=videoClass + '-play', videoCloseClass=videoClass + '-close', captionClass=_fotoramaClass + '__caption', captionWrapClass=_fotoramaClass + '__caption__wrap', spinnerClass=_fotoramaClass + '__spinner', buttonAttributes='" tabindex="0" role="button'; var JQUERY_VERSION=$ && $.fn.jquery.split('.'); if(!JQUERY_VERSION || JQUERY_VERSION[0] < 1 || (JQUERY_VERSION[0]==1 && JQUERY_VERSION[1] < 8)){ throw 'Fotorama requires jQuery 1.8 or later and will not run without it.'; } var _={}; var Modernizr=(function (window, document, undefined){ var version='2.6.2', Modernizr={}, docElement=document.documentElement, mod='modernizr', modElem=document.createElement(mod), mStyle=modElem.style, inputElem, toString={}.toString, prefixes=' -webkit- -moz- -o- -ms- '.split(' '), omPrefixes='Webkit Moz O ms', cssomPrefixes=omPrefixes.split(' '), domPrefixes=omPrefixes.toLowerCase().split(' '), tests={}, inputs={}, attrs={}, classes=[], slice=classes.slice, featureName, injectElementWithStyles=function (rule, callback, nodes, testnames){ var style, ret, node, docOverflow, div=document.createElement('div'), body=document.body, fakeBody=body || document.createElement('body'); if(parseInt(nodes, 10)){ while (nodes--){ node=document.createElement('div'); node.id=testnames ? testnames[nodes]:mod + (nodes + 1); div.appendChild(node); }} style=['­', ''].join(''); div.id=mod; (body ? div:fakeBody).innerHTML +=style; fakeBody.appendChild(div); if(!body){ fakeBody.style.background=''; fakeBody.style.overflow='hidden'; docOverflow=docElement.style.overflow; docElement.style.overflow='hidden'; docElement.appendChild(fakeBody); } ret=callback(div, rule); if(!body){ fakeBody.parentNode.removeChild(fakeBody); docElement.style.overflow=docOverflow; }else{ div.parentNode.removeChild(div); } return !!ret; }, _hasOwnProperty=({}).hasOwnProperty, hasOwnProp; if(!is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined')){ hasOwnProp=function (object, property){ return _hasOwnProperty.call(object, property); };}else{ hasOwnProp=function (object, property){ return ((property in object) && is(object.constructor.prototype[property], 'undefined')); };} if(!Function.prototype.bind){ Function.prototype.bind=function bind (that){ var target=this; if(typeof target!="function"){ throw new TypeError(); } var args=slice.call(arguments, 1), bound=function (){ if(this instanceof bound){ var F=function (){ }; F.prototype=target.prototype; var self=new F(); var result=target.apply(self, args.concat(slice.call(arguments))); if(Object(result)===result){ return result; } return self; }else{ return target.apply(that, args.concat(slice.call(arguments))); }}; return bound; };} function setCss (str){ mStyle.cssText=str; } function setCssAll (str1, str2){ return setCss(prefixes.join(str1 + ';') + (str2 || '')); } function is (obj, type){ return typeof obj===type; } function contains (str, substr){ return !!~('' + str).indexOf(substr); } function testProps (props, prefixed){ for (var i in props){ var prop=props[i]; if(!contains(prop, "-") && mStyle[prop]!==undefined){ return prefixed=='pfx' ? prop:true; }} return false; } function testDOMProps (props, obj, elem){ for (var i in props){ var item=obj[props[i]]; if(item!==undefined){ if(elem===false) return props[i]; if(is(item, 'function')){ return item.bind(elem || obj); } return item; }} return false; } function testPropsAll (prop, prefixed, elem){ var ucProp=prop.charAt(0).toUpperCase() + prop.slice(1), props=(prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); if(is(prefixed, "string") || is(prefixed, "undefined")){ return testProps(props, prefixed); }else{ props=(prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); return testDOMProps(props, prefixed, elem); }} tests['csstransforms3d']=function (){ var ret=!!testPropsAll('perspective'); // return ret; }; for (var feature in tests){ if(hasOwnProp(tests, feature)){ featureName=feature.toLowerCase(); Modernizr[featureName]=tests[feature](); classes.push((Modernizr[featureName] ? '':'no-') + featureName); }} Modernizr.addTest=function (feature, test){ if(typeof feature=='object'){ for (var key in feature){ if(hasOwnProp(feature, key)){ Modernizr.addTest(key, feature[ key ]); }} }else{ feature=feature.toLowerCase(); if(Modernizr[feature]!==undefined){ return Modernizr; } test=typeof test=='function' ? test():test; if(typeof enableClasses!=="undefined" && enableClasses){ docElement.className +=' ' + (test ? '':'no-') + feature; } Modernizr[feature]=test; } return Modernizr; }; setCss(''); modElem=inputElem=null; Modernizr._version=version; Modernizr._prefixes=prefixes; Modernizr._domPrefixes=domPrefixes; Modernizr._cssomPrefixes=cssomPrefixes; Modernizr.testProp=function (prop){ return testProps([prop]); }; Modernizr.testAllProps=testPropsAll; Modernizr.testStyles=injectElementWithStyles; Modernizr.prefixed=function (prop, obj, elem){ if(!obj){ return testPropsAll(prop, 'pfx'); }else{ return testPropsAll(prop, obj, elem); }}; return Modernizr; })(window, document); var fullScreenApi={ ok:false, is:function (){ return false; }, request:function (){ }, cancel:function (){ }, event:'', prefix:'' }, browserPrefixes='webkit moz o ms khtml'.split(' '); if(typeof document.cancelFullScreen!='undefined'){ fullScreenApi.ok=true; }else{ for (var i=0, il=browserPrefixes.length; i < il; i++){ fullScreenApi.prefix=browserPrefixes[i]; if(typeof document[fullScreenApi.prefix + 'CancelFullScreen' ]!='undefined'){ fullScreenApi.ok=true; break; }} } if(fullScreenApi.ok){ fullScreenApi.event=fullScreenApi.prefix + 'fullscreenchange'; fullScreenApi.is=function (){ switch (this.prefix){ case '':return document.fullScreen; case 'webkit':return document.webkitIsFullScreen; default:return document[this.prefix + 'FullScreen']; }}; fullScreenApi.request=function (el){ return (this.prefix==='') ? el.requestFullScreen():el[this.prefix + 'RequestFullScreen'](); }; fullScreenApi.cancel=function (el){ return (this.prefix==='') ? document.cancelFullScreen():document[this.prefix + 'CancelFullScreen'](); };} var Spinner, spinnerDefaults={ lines:12, length:5, width:2, radius:7, corners:1, rotate:15, color:'rgba(128, 128, 128, .75)', hwaccel:true }, spinnerOverride={ top:'auto', left:'auto', className:'' }; (function(root, factory){ Spinner=factory(); } (this, function(){ "use strict"; var prefixes=['webkit', 'Moz', 'ms', 'O'] , animations={} , useCssAnimations function createEl(tag, prop){ var el=document.createElement(tag || 'div') , n for(n in prop) el[n]=prop[n] return el } function ins(parent){ for (var i=1, n=arguments.length; i> 1):parseInt(o.left, 10) + mid) + 'px', top:(o.top=='auto' ? tp.y-ep.y + (target.offsetHeight >> 1):parseInt(o.top, 10) + mid) + 'px' }) } el.setAttribute('role', 'progressbar') self.lines(el, self.opts) if(!useCssAnimations){ var i=0 , start=(o.lines - 1) * (1 - o.direction) / 2 , alpha , fps=o.fps , f=fps/o.speed , ostep=(1-o.opacity) / (f*o.trail / 100) , astep=f/o.lines ;(function anim(){ i++; for (var j=0; j < o.lines; j++){ alpha=Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity) self.opacity(el, j * o.direction + start, alpha, o) } self.timeout=self.el && setTimeout(anim, ~~(1000/fps)) })() } return self }, stop:function(){ var el=this.el if(el){ clearTimeout(this.timeout) if(el.parentNode) el.parentNode.removeChild(el) this.el=undefined } return this }, lines:function(el, o){ var i=0 , start=(o.lines - 1) * (1 - o.direction) / 2 , seg function fill(color, shadow){ return css(createEl(), { position:'absolute', width:(o.length+o.width) + 'px', height:o.width + 'px', background:color, boxShadow:shadow, transformOrigin:'left', transform:'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)', borderRadius:(o.corners * o.width>>1) + 'px' }) } for (; i < o.lines; i++){ seg=css(createEl(), { position:'absolute', top:1+~(o.width/2) + 'px', transform:o.hwaccel ? 'translate3d(0,0,0)':'', opacity:o.opacity, animation:useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite' }) if(o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top:2+'px'})) ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)'))) } return el }, opacity:function(el, i, val){ if(i < el.childNodes.length) el.childNodes[i].style.opacity=val }}) function initVML(){ function vml(tag, attr){ return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) } sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') Spinner.prototype.lines=function(el, o){ var r=o.length+o.width , s=2*r function grp(){ return css(vml('group', { coordsize:s + ' ' + s, coordorigin:-r + ' ' + -r }), { width:s, height:s }) } var margin=-(o.width+o.length)*2 + 'px' , g=css(grp(), {position:'absolute', top:margin, left:margin}) , i function seg(i, dx, filter){ ins(g, ins(css(grp(), {rotation:360 / o.lines * i + 'deg', left:~~dx}), ins(css(vml('roundrect', {arcsize:o.corners}), { width:r, height:o.width, left:o.radius, top:-o.width>>1, filter:filter }), vml('fill', {color:getColor(o.color, i), opacity:o.opacity}), vml('stroke', {opacity:0})))) } if(o.shadow) for (i=1; i <=o.lines; i++) seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') for (i=1; i <=o.lines; i++) seg(i) return ins(el, g) } Spinner.prototype.opacity=function(el, i, val, o){ var c=el.firstChild o=o.shadow && o.lines || 0 if(c && i+o < c.childNodes.length){ c=c.childNodes[i+o]; c=c && c.firstChild; c=c && c.firstChild if(c) c.opacity=val }} } var probe=css(createEl('group'), {behavior:'url(#default#VML)'}) if(!vendor(probe, 'transform') && probe.adj) initVML() else useCssAnimations=vendor(probe, 'animation') return Spinner })); function bez (coOrdArray){ var encodedFuncName="bez_" + $.makeArray(arguments).join("_").replace(".", "p"); if(typeof $['easing'][encodedFuncName]!=="function"){ var polyBez=function (p1, p2){ var A=[null, null], B=[null, null], C=[null, null], bezCoOrd=function (t, ax){ C[ax]=3 * p1[ax]; B[ax]=3 * (p2[ax] - p1[ax]) - C[ax]; A[ax]=1 - C[ax] - B[ax]; return t * (C[ax] + t * (B[ax] + t * A[ax])); }, xDeriv=function (t){ return C[0] + t * (2 * B[0] + 3 * A[0] * t); }, xForT=function (t){ var x=t, i=0, z; while (++i < 14){ z=bezCoOrd(x, 0) - t; if(Math.abs(z) < 1e-3) break; x -=z / xDeriv(x); } return x; }; return function (t){ return bezCoOrd(xForT(t), 1); }}; $['easing'][encodedFuncName]=function (x, t, b, c, d){ return c * polyBez([coOrdArray[0], coOrdArray[1]], [coOrdArray[2], coOrdArray[3]])(t / d) + b; }} return encodedFuncName; } var $WINDOW=$(window), $DOCUMENT=$(document), $HTML, $BODY, QUIRKS_FORCE=location.hash.replace('#', '')==='quirks', TRANSFORMS3D=Modernizr.csstransforms3d, CSS3=TRANSFORMS3D && !QUIRKS_FORCE, COMPAT=TRANSFORMS3D || document.compatMode==='CSS1Compat', FULLSCREEN=fullScreenApi.ok, MOBILE=navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i), SLOW=!CSS3 || MOBILE, MS_POINTER=navigator.msPointerEnabled, WHEEL="onwheel" in document.createElement("div") ? "wheel":document.onmousewheel!==undefined ? "mousewheel":"DOMMouseScroll", TOUCH_TIMEOUT=250, TRANSITION_DURATION=300, SCROLL_LOCK_TIMEOUT=1400, AUTOPLAY_INTERVAL=5000, MARGIN=2, THUMB_SIZE=64, WIDTH=500, HEIGHT=333, STAGE_FRAME_KEY='$stageFrame', NAV_DOT_FRAME_KEY='$navDotFrame', NAV_THUMB_FRAME_KEY='$navThumbFrame', AUTO='auto', BEZIER=bez([.1, 0, .25, 1]), MAX_WIDTH=99999, FIFTYFIFTY='50%', OPTIONS={ width:null, minwidth:null, maxwidth:'100%', // '100%' height:null, minheight:null, maxheight:null, ratio:null, // '16/9' || 500/333 || 1.5 margin:MARGIN, glimpse:0, fit:'contain', // 'cover' || 'scaledown' || 'none' position:FIFTYFIFTY, thumbposition:FIFTYFIFTY, nav:'dots', // 'thumbs' || false navposition:'bottom', // 'top' navwidth:null, thumbwidth:THUMB_SIZE, thumbheight:THUMB_SIZE, thumbmargin:MARGIN, thumbborderwidth:MARGIN, thumbfit:'cover', // 'contain' || 'scaledown' || 'none' allowfullscreen:false, transition:'slide', // 'crossfade' || 'dissolve' clicktransition:null, transitionduration:TRANSITION_DURATION, captions:true, hash:false, startindex:0, loop:false, autoplay:false, stopautoplayontouch:true, keyboard:false, arrows:true, click:true, swipe:true, trackpad:false, enableifsingleframe:false, controlsonstart:true, shuffle:false, direction:'ltr', // 'rtl' shadows:true, spinner:null }, KEYBOARD_OPTIONS={ left:true, right:true, down:false, up:false, space:false, home:false, end:false }; function noop (){} function minMaxLimit (value, min, max){ return Math.max(isNaN(min) ? -Infinity:min, Math.min(isNaN(max) ? Infinity:max, value)); } function readTransform (css){ return css.match(/ma/) && css.match(/-?\d+(?!d)/g)[css.match(/3d/) ? 12:4]; } function readPosition ($el){ if(CSS3){ return +readTransform($el.css('transform')); }else{ return +$el.css('left').replace('px', ''); }} function getTranslate (pos){ var obj={}; if(CSS3){ obj.transform='translate3d(' + (pos) + 'px,0,0)'; }else{ obj.left=pos; } return obj; } function getDuration (time){ return {'transition-duration':time + 'ms'};} function unlessNaN (value, alternative){ return isNaN(value) ? alternative:value; } function numberFromMeasure (value, measure){ return unlessNaN(+String(value).replace(measure || 'px', '')); } function numberFromPercent (value){ return /%$/.test(value) ? numberFromMeasure(value, '%'):undefined; } function numberFromWhatever (value, whole){ return unlessNaN(numberFromPercent(value) / 100 * whole, numberFromMeasure(value)); } function measureIsValid (value){ return (!isNaN(numberFromMeasure(value)) || !isNaN(numberFromMeasure(value, '%'))) && value; } function getPosByIndex (index, side, margin, baseIndex){ //console.log('getPosByIndex', index, side, margin, baseIndex); //console.log((index - (baseIndex || 0)) * (side + (margin || 0))); return (index - (baseIndex || 0)) * (side + (margin || 0)); } function getIndexByPos (pos, side, margin, baseIndex){ return -Math.round(pos / (side + (margin || 0)) - (baseIndex || 0)); } function bindTransitionEnd ($el){ var elData=$el.data(); if(elData.tEnd) return; var el=$el[0], transitionEndEvent={ WebkitTransition:'webkitTransitionEnd', MozTransition:'transitionend', OTransition:'oTransitionEnd otransitionend', msTransition:'MSTransitionEnd', transition:'transitionend' }; addEvent(el, transitionEndEvent[Modernizr.prefixed('transition')], function (e){ elData.tProp && e.propertyName.match(elData.tProp) && elData.onEndFn(); });elData.tEnd=true; } function afterTransition ($el, property, fn, time){ var ok, elData=$el.data(); if(elData){ elData.onEndFn=function (){ if(ok) return; ok=true; clearTimeout(elData.tT); fn(); }; elData.tProp=property; clearTimeout(elData.tT); elData.tT=setTimeout(function (){ elData.onEndFn(); }, time * 1.5); bindTransitionEnd($el); }} function stop ($el, left){ if($el.length){ var elData=$el.data(); if(CSS3){ $el.css(getDuration(0)); elData.onEndFn=noop; clearTimeout(elData.tT); }else{ $el.stop(); } var lockedLeft=getNumber(left, function (){ return readPosition($el); });$el.css(getTranslate(lockedLeft)); return lockedLeft; }} function getNumber (){ var number; for (var _i=0, _l=arguments.length; _i < _l; _i++){ number=_i ? arguments[_i]():arguments[_i]; if(typeof number==='number'){ break; }} return number; } function edgeResistance (pos, edge){ return Math.round(pos + ((edge - pos) / 1.5)); } function getProtocol (){ getProtocol.p=getProtocol.p || (location.protocol==='https:' ? 'https://':'http://'); return getProtocol.p; } function parseHref (href){ var a=document.createElement('a'); a.href=href; return a; } function findVideoId (href, forceVideo){ if(typeof href!=='string') return href; href=parseHref(href); var id, type; if(href.host.match(/youtube\.com/) && href.search){ id=href.search.split('v=')[1]; if(id){ var ampersandPosition=id.indexOf('&'); if(ampersandPosition!==-1){ id=id.substring(0, ampersandPosition); } type='youtube'; }} else if(href.host.match(/youtube\.com|youtu\.be/)){ id=href.pathname.replace(/^\/(embed\/|v\/)?/, '').replace(/\/.*/, ''); type='youtube'; } else if(href.host.match(/vimeo\.com/)){ type='vimeo'; id=href.pathname.replace(/^\/(video\/)?/, '').replace(/\/.*/, ''); } if((!id || !type) && forceVideo){ id=href.href; type='custom'; } return id ? {id:id, type:type, s:href.search.replace(/^\?/, ''), p:getProtocol()}:false; } function getVideoThumbs (dataFrame, data, fotorama){ var img, thumb, video=dataFrame.video; if(video.type==='youtube'){ thumb=getProtocol() + 'img.youtube.com/vi/' + video.id + '/default.jpg'; img=thumb.replace(/\/default.jpg$/, '/hqdefault.jpg'); dataFrame.thumbsReady=true; } else if(video.type==='vimeo'){ $.ajax({ url:getProtocol() + 'vimeo.com/api/v2/video/' + video.id + '.json', dataType:'jsonp', success:function (json){ dataFrame.thumbsReady=true; updateData(data, {img:json[0].thumbnail_large, thumb:json[0].thumbnail_small}, dataFrame.i, fotorama); }});}else{ dataFrame.thumbsReady=true; } return { img:img, thumb:thumb }} function updateData (data, _dataFrame, i, fotorama){ for (var _i=0, _l=data.length; _i < _l; _i++){ var dataFrame=data[_i]; if(dataFrame.i===i && dataFrame.thumbsReady){ var clear={videoReady:true}; clear[STAGE_FRAME_KEY]=clear[NAV_THUMB_FRAME_KEY]=clear[NAV_DOT_FRAME_KEY]=false; fotorama.splice(_i, 1, $.extend({}, dataFrame, clear, _dataFrame)); break; }} } function getDataFromHtml ($el){ var data=[]; function getDataFromImg ($img, imgData, checkVideo){ var $child=$img.children('img').eq(0), _imgHref=$img.attr('href'), _imgSrc=$img.attr('src'), _thumbSrc=$child.attr('src'), _video=imgData.video, video=checkVideo ? findVideoId(_imgHref, _video===true):false; if(video){ _imgHref=false; }else{ video=_video; } getDimensions($img, $child, $.extend(imgData, { video:video, img:imgData.img || _imgHref || _imgSrc || _thumbSrc, thumb:imgData.thumb || _thumbSrc || _imgSrc || _imgHref })); } function getDimensions ($img, $child, imgData){ var separateThumbFLAG=imgData.thumb && imgData.img!==imgData.thumb, width=numberFromMeasure(imgData.width || $img.attr('width')), height=numberFromMeasure(imgData.height || $img.attr('height')); $.extend(imgData, { width:width, height:height, thumbratio:getRatio(imgData.thumbratio || (numberFromMeasure(imgData.thumbwidth || ($child && $child.attr('width')) || separateThumbFLAG || width) / numberFromMeasure(imgData.thumbheight || ($child && $child.attr('height')) || separateThumbFLAG || height))) });} $el.children().each(function (){ var $this=$(this), dataFrame=optionsToLowerCase($.extend($this.data(), {id:$this.attr('id')})); if($this.is('a, img')){ getDataFromImg($this, dataFrame, true); } else if(!$this.is(':empty')){ getDimensions($this, null, $.extend(dataFrame, { html:this, _html:$this.html() })); } else return; data.push(dataFrame); });return data; } function isHidden (el){ return el.offsetWidth===0 && el.offsetHeight===0; } function isDetached (el){ return !$.contains(document.documentElement, el); } function waitFor (test, fn, timeout, i){ if(!waitFor.i){ waitFor.i=1; waitFor.ii=[true]; } i=i || waitFor.i; if(typeof waitFor.ii[i]==='undefined'){ waitFor.ii[i]=true; } if(test()){ fn(); }else{ waitFor.ii[i] && setTimeout(function (){ waitFor.ii[i] && waitFor(test, fn, timeout, i); }, timeout || 100); } return waitFor.i++; } waitFor.stop=function (i){ waitFor.ii[i]=false; }; function setHash (hash){ ////console.time('setHash ' + hash); location.replace(location.protocol + '//' + location.host + location.pathname.replace(/^\/?/, '/') + location.search + '#' + hash); ////console.timeEnd('setHash ' + hash); } function fit ($el, measuresToFit, method, position){ var elData=$el.data(), measures=elData.measures; if(measures && (!elData.l || elData.l.W!==measures.width || elData.l.H!==measures.height || elData.l.r!==measures.ratio || elData.l.w!==measuresToFit.w || elData.l.h!==measuresToFit.h || elData.l.m!==method || elData.l.p!==position)){ console.log('fit'); var width=measures.width, height=measures.height, ratio=measuresToFit.w / measuresToFit.h, biggerRatioFLAG=measures.ratio >=ratio, fitFLAG=method==='scaledown', containFLAG=method==='contain', coverFLAG=method==='cover', pos=parsePosition(position); if(biggerRatioFLAG && (fitFLAG || containFLAG) || !biggerRatioFLAG && coverFLAG){ width=minMaxLimit(measuresToFit.w, 0, fitFLAG ? width:Infinity); height=width / measures.ratio; } else if(biggerRatioFLAG && coverFLAG || !biggerRatioFLAG && (fitFLAG || containFLAG)){ height=minMaxLimit(measuresToFit.h, 0, fitFLAG ? height:Infinity); width=height * measures.ratio; } $el.css({ width:width, height:height, left:numberFromWhatever(pos.x, measuresToFit.w - width), top:numberFromWhatever(pos.y, measuresToFit.h- height) });elData.l={ W:measures.width, H:measures.height, r:measures.ratio, w:measuresToFit.w, h:measuresToFit.h, m:method, p:position };} return true; } function setStyle ($el, style){ var el=$el[0]; if(el.styleSheet){ el.styleSheet.cssText=style; }else{ $el.html(style); }} function findShadowEdge (pos, min, max){ return min===max ? false:pos <=min ? 'left':pos >=max ? 'right':'left right'; } function getIndexFromHash (hash, data, ok, startindex){ if(!ok) return false; if(!isNaN(hash)) return hash - (startindex ? 0:1); var index; for (var _i=0, _l=data.length; _i < _l; _i++){ var dataFrame=data[_i]; if(dataFrame.id===hash){ index=_i; break; }} return index; } function smartClick ($el, fn, _options){ _options=_options || {}; $el.each(function (){ var $this=$(this), thisData=$this.data(), startEvent; if(thisData.clickOn) return; thisData.clickOn=true; $.extend(touch($this, { onStart:function (e){ startEvent=e; (_options.onStart || noop).call(this, e); }, onMove:_options.onMove || noop, onTouchEnd:_options.onTouchEnd || noop, onEnd:function (result){ //console.log('smartClick → result.moved', result.moved); if(result.moved) return; fn.call(this, startEvent); }}), {noMove:true});});} function div (classes, child){ return '
' + (child || '') + '
'; } function shuffle (array){ var l=array.length; while (l){ var i=Math.floor(Math.random() * l--); var t=array[l]; array[l]=array[i]; array[i]=t; } return array; } function clone (array){ return Object.prototype.toString.call(array)=='[object Array]' && $.map(array, function (frame){ return $.extend({}, frame); });} function lockScroll ($el, left, top){ $el .scrollLeft(left || 0) .scrollTop(top || 0); } function optionsToLowerCase (options){ if(options){ var opts={}; $.each(options, function (key, value){ opts[key.toLowerCase()]=value; });return opts; }} function getRatio (_ratio){ if(!_ratio) return; var ratio=+_ratio; if(!isNaN(ratio)){ return ratio; }else{ ratio=_ratio.split('/'); return +ratio[0] / +ratio[1] || undefined; }} function addEvent (el, e, fn, bool){ if(!e) return; el.addEventListener ? el.addEventListener(e, fn, !!bool):el.attachEvent('on'+e, fn); } function elIsDisabled (el){ return !!el.getAttribute('disabled'); } function disableAttr (FLAG){ return {tabindex:FLAG * -1 + '', disabled:FLAG};} function addEnterUp (el, fn){ addEvent(el, 'keyup', function (e){ elIsDisabled(el) || e.keyCode==13 && fn.call(el, e); });} function addFocus (el, fn){ addEvent(el, 'focus', el.onfocusin=function (e){ fn.call(el, e); }, true); } function stopEvent (e, stopPropagation){ e.preventDefault ? e.preventDefault():(e.returnValue=false); stopPropagation && e.stopPropagation && e.stopPropagation(); } function getDirectionSign (forward){ return forward ? '>':'<'; } function parsePosition (rule){ rule=(rule + '').split(/\s+/); return { x:measureIsValid(rule[0]) || FIFTYFIFTY, y:measureIsValid(rule[1]) || FIFTYFIFTY }} function slide ($el, options){ var elData=$el.data(), elPos=Math.round(options.pos), onEndFn=function (){ elData.sliding=false; (options.onEnd || noop)(); }; if(typeof options.overPos!=='undefined' && options.overPos!==options.pos){ elPos=options.overPos; onEndFn=function (){ slide($el, $.extend({}, options, {overPos:options.pos, time:Math.max(TRANSITION_DURATION, options.time / 2)})) };} //////console.time('var translate=$.extend'); var translate=$.extend(getTranslate(elPos), options.width && {width:options.width});//////console.timeEnd('var translate=$.extend'); elData.sliding=true; if(CSS3){ $el.css($.extend(getDuration(options.time), translate)); if(options.time > 10){ //////console.time('afterTransition'); afterTransition($el, 'transform', onEndFn, options.time); //////console.timeEnd('afterTransition'); }else{ onEndFn(); }}else{ $el.stop().animate(translate, options.time, BEZIER, onEndFn); }} function fade ($el1, $el2, $frames, options, fadeStack, chain){ var chainedFLAG=typeof chain!=='undefined'; if(!chainedFLAG){ fadeStack.push(arguments); Array.prototype.push.call(arguments, fadeStack.length); if(fadeStack.length > 1) return; } $el1=$el1 || $($el1); $el2=$el2 || $($el2); var _$el1=$el1[0], _$el2=$el2[0], crossfadeFLAG=options.method==='crossfade', onEndFn=function (){ if(!onEndFn.done){ onEndFn.done=true; var args=(chainedFLAG || fadeStack.shift()) && fadeStack.shift(); args && fade.apply(this, args); (options.onEnd || noop)(!!args); }}, time=options.time / (chain || 1); $frames.removeClass(fadeRearClass + ' ' + fadeFrontClass); $el1 .stop() .addClass(fadeRearClass); $el2 .stop() .addClass(fadeFrontClass); crossfadeFLAG && _$el2 && $el1.fadeTo(0, 0); $el1.fadeTo(crossfadeFLAG ? time:0, 1, crossfadeFLAG && onEndFn); $el2.fadeTo(time, 0, onEndFn); (_$el1 && crossfadeFLAG) || _$el2 || onEndFn(); } var lastEvent, moveEventType, preventEvent, preventEventTimeout; function extendEvent (e){ var touch=(e.touches || [])[0] || e; e._x=touch.pageX; e._y=touch.clientY; e._now=$.now(); } function touch ($el, options){ var el=$el[0], tail={}, touchEnabledFLAG, startEvent, $target, controlTouch, touchFLAG, targetIsSelectFLAG, targetIsLinkFlag, tolerance, moved; function onStart (e){ $target=$(e.target); tail.checked=targetIsSelectFLAG=targetIsLinkFlag=moved=false; if(touchEnabledFLAG || tail.flow || (e.touches && e.touches.length > 1) || e.which > 1 || (lastEvent && lastEvent.type!==e.type && preventEvent) || (targetIsSelectFLAG=options.select && $target.is(options.select, el))) return targetIsSelectFLAG; touchFLAG=e.type==='touchstart'; targetIsLinkFlag=$target.is('a, a *', el); controlTouch=tail.control; tolerance=(tail.noMove || tail.noSwipe || controlTouch) ? 16:!tail.snap ? 4:0; extendEvent(e); startEvent=lastEvent=e; moveEventType=e.type.replace(/down|start/, 'move').replace(/Down/, 'Move'); (options.onStart || noop).call(el, e, {control:controlTouch, $target:$target});touchEnabledFLAG=tail.flow=true; if(!touchFLAG || tail.go) stopEvent(e); } function onMove (e){ if((e.touches && e.touches.length > 1) || (MS_POINTER && !e.isPrimary) || moveEventType!==e.type || !touchEnabledFLAG){ touchEnabledFLAG && onEnd(); (options.onTouchEnd || noop)(); return; } extendEvent(e); var xDiff=Math.abs(e._x - startEvent._x), yDiff=Math.abs(e._y - startEvent._y), xyDiff=xDiff - yDiff, xWin=(tail.go || tail.x || xyDiff >=0) && !tail.noSwipe, yWin=xyDiff < 0; if(touchFLAG && !tail.checked){ if(touchEnabledFLAG=xWin){ stopEvent(e); }}else{ //console.log('onMove e.preventDefault'); stopEvent(e); (options.onMove || noop).call(el, e, {touch:touchFLAG});} if(!moved && Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2)) > tolerance){ moved=true; } tail.checked=tail.checked || xWin || yWin; } function onEnd (e){ ////console.time('touch.js onEnd'); (options.onTouchEnd || noop)(); var _touchEnabledFLAG=touchEnabledFLAG; tail.control=touchEnabledFLAG=false; if(_touchEnabledFLAG){ tail.flow=false; } if(!_touchEnabledFLAG || (targetIsLinkFlag && !tail.checked)) return; e && stopEvent(e); preventEvent=true; clearTimeout(preventEventTimeout); preventEventTimeout=setTimeout(function (){ preventEvent=false; }, 1000); (options.onEnd || noop).call(el, {moved:moved, $target:$target, control:controlTouch, touch:touchFLAG, startEvent:startEvent, aborted:!e || e.type==='MSPointerCancel'});////console.timeEnd('touch.js onEnd'); } function onOtherStart (){ if(tail.flow) return; setTimeout(function (){ tail.flow=true; }, 10); } function onOtherEnd (){ if(!tail.flow) return; setTimeout(function (){ tail.flow=false; }, TOUCH_TIMEOUT); } if(MS_POINTER){ addEvent(el, 'MSPointerDown', onStart); addEvent(document, 'MSPointerMove', onMove); addEvent(document,'MSPointerCancel', onEnd); addEvent(document, 'MSPointerUp', onEnd); }else{ addEvent(el, 'touchstart', onStart); addEvent(el, 'touchmove', onMove); addEvent(el, 'touchend', onEnd); addEvent(document, 'touchstart', onOtherStart); addEvent(document, 'touchend', onOtherEnd); addEvent(document, 'touchcancel', onOtherEnd); $WINDOW.on('scroll', onOtherEnd); $el.on('mousedown', onStart); $DOCUMENT .on('mousemove', onMove) .on('mouseup', onEnd); } $el.on('click', 'a', function (e){ tail.checked && stopEvent(e); });return tail; } function moveOnTouch ($el, options){ var el=$el[0], elData=$el.data(), tail={}, startCoo, coo, startElPos, moveElPos, edge, moveTrack, startTime, endTime, min, max, snap, slowFLAG, controlFLAG, moved, tracked; function startTracking (e, noStop){ tracked=true; startCoo=coo=e._x; startTime=e._now; moveTrack=[ [startTime, startCoo] ]; startElPos=moveElPos=tail.noMove || noStop ? 0:stop($el, (options.getPos || noop)()); (options.onStart || noop).call(el, e); } function onStart (e, result){ min=tail.min; max=tail.max; snap=tail.snap; slowFLAG=e.altKey; tracked=moved=false; controlFLAG=result.control; if(!controlFLAG && !elData.sliding){ startTracking(e); }} function onMove (e, result){ if(!tail.noSwipe){ if(!tracked){ startTracking(e); } coo=e._x; moveTrack.push([e._now, coo]); moveElPos=startElPos - (startCoo - coo); edge=findShadowEdge(moveElPos, min, max); if(moveElPos <=min){ moveElPos=edgeResistance(moveElPos, min); } else if(moveElPos >=max){ moveElPos=edgeResistance(moveElPos, max); } if(!tail.noMove){ $el.css(getTranslate(moveElPos)); if(!moved){ moved=true; result.touch || MS_POINTER || $el.addClass(grabbingClass); } (options.onMove || noop).call(el, e, {pos:moveElPos, edge:edge});}} } function onEnd (result){ ////console.time('moveontouch.js onEnd'); if(tail.noSwipe && result.moved) return; if(!tracked){ startTracking(result.startEvent, true); } //console.log('onEnd'); result.touch || MS_POINTER || $el.removeClass(grabbingClass); endTime=$.now(); var _backTimeIdeal=endTime - TOUCH_TIMEOUT, _backTime, _timeDiff, _timeDiffLast, backTime=null, backCoo, virtualPos, limitPos, newPos, overPos, time=TRANSITION_DURATION, speed, friction=options.friction; for (var _i=moveTrack.length - 1; _i >=0; _i--){ _backTime=moveTrack[_i][0]; _timeDiff=Math.abs(_backTime - _backTimeIdeal); if(backTime===null || _timeDiff < _timeDiffLast){ backTime=_backTime; backCoo=moveTrack[_i][1]; } else if(backTime===_backTimeIdeal || _timeDiff > _timeDiffLast){ break; } _timeDiffLast=_timeDiff; } newPos=minMaxLimit(moveElPos, min, max); var cooDiff=backCoo - coo, forwardFLAG=cooDiff >=0, timeDiff=endTime - backTime, longTouchFLAG=timeDiff > TOUCH_TIMEOUT, swipeFLAG=!longTouchFLAG && moveElPos!==startElPos && newPos===moveElPos; if(snap){ newPos=minMaxLimit(Math[swipeFLAG ? (forwardFLAG ? 'floor':'ceil'):'round'](moveElPos / snap) * snap, min, max); min=max=newPos; } if(swipeFLAG && (snap || newPos===moveElPos)){ speed=-(cooDiff / timeDiff); time *=minMaxLimit(Math.abs(speed), options.timeLow, options.timeHigh); virtualPos=Math.round(moveElPos + speed * time / friction); if(!snap){ newPos=virtualPos; } if(!forwardFLAG && virtualPos > max || forwardFLAG && virtualPos < min){ limitPos=forwardFLAG ? min:max; overPos=virtualPos - limitPos; if(!snap){ newPos=limitPos; } overPos=minMaxLimit(newPos + overPos * .03, limitPos - 50, limitPos + 50); time=Math.abs((moveElPos - overPos) / (speed / friction)); }} time *=slowFLAG ? 10:1; (options.onEnd || noop).call(el, $.extend(result, {moved:result.moved || longTouchFLAG && snap, pos:moveElPos, newPos:newPos, overPos:overPos, time:time})); } tail=$.extend(touch(options.$wrap, $.extend({}, options, { onStart:onStart, onMove:onMove, onEnd:onEnd })), tail); return tail; } function wheel ($el, options){ var el=$el[0], lockFLAG, lastDirection, lastNow, tail={ prevent:{}}; addEvent(el, WHEEL, function (e){ var yDelta=e.wheelDeltaY || -1 * e.deltaY || 0, xDelta=e.wheelDeltaX || -1 * e.deltaX || 0, xWin=Math.abs(xDelta) && !Math.abs(yDelta), direction=getDirectionSign(xDelta < 0), sameDirection=lastDirection===direction, now=$.now(), tooFast=now - lastNow < TOUCH_TIMEOUT; lastDirection=direction; lastNow=now; if(!xWin || !tail.ok || tail.prevent[direction] && !lockFLAG){ return; }else{ stopEvent(e, true); if(lockFLAG && sameDirection && tooFast){ return; }} if(options.shift){ lockFLAG=true; clearTimeout(tail.t); tail.t=setTimeout(function (){ lockFLAG=false; }, SCROLL_LOCK_TIMEOUT); } (options.onEnd || noop)(e, options.shift ? direction:xDelta); });return tail; } jQuery.Fotorama=function ($fotorama, opts){ $HTML=$('html'); $BODY=$('body'); var that=this, stamp=$.now(), stampClass=_fotoramaClass + stamp, fotorama=$fotorama[0], data, dataFrameCount=1, fotoramaData=$fotorama.data(), size, $style=$(''), $anchor=$(div(hiddenClass)), $wrap=$(div(wrapClass)), $stage=$(div(stageClass)).appendTo($wrap), stage=$stage[0], $stageShaft=$(div(stageShaftClass)).appendTo($stage), $stageFrame=$(), $arrPrev=$(div(arrClass + ' ' + arrPrevClass + buttonAttributes)), $arrNext=$(div(arrClass + ' ' + arrNextClass + buttonAttributes)), $arrs=$arrPrev.add($arrNext).appendTo($stage), $navWrap=$(div(navWrapClass)), $nav=$(div(navClass)).appendTo($navWrap), $navShaft=$(div(navShaftClass)).appendTo($nav), $navFrame, $navDotFrame=$(), $navThumbFrame=$(), stageShaftData=$stageShaft.data(), navShaftData=$navShaft.data(), $thumbBorder=$(div(thumbBorderClass)).appendTo($navShaft), $fullscreenIcon=$(div(fullscreenIconClass + buttonAttributes)), fullscreenIcon=$fullscreenIcon[0], $videoPlay=$(div(videoPlayClass)), $videoClose=$(div(videoCloseClass)).appendTo($stage), videoClose=$videoClose[0], spinner, $spinner=$(div(spinnerClass)), $videoPlaying, activeIndex=false, activeFrame, activeIndexes, repositionIndex, dirtyIndex, lastActiveIndex, prevIndex, nextIndex, nextAutoplayIndex, startIndex, o_loop, o_nav, o_navThumbs, o_navTop, o_allowFullScreen, o_nativeFullScreen, o_fade, o_thumbSide, o_thumbSide2, o_transitionDuration, o_transition, o_shadows, o_rtl, o_keyboard, lastOptions={}, measures={}, measuresSetFLAG, stageShaftTouchTail={}, stageWheelTail={}, navShaftTouchTail={}, navWheelTail={}, scrollTop, scrollLeft, showedFLAG, pausedAutoplayFLAG, stoppedAutoplayFLAG, toDeactivate={}, toDetach={}, measuresStash, touchedFLAG, hoverFLAG, navFrameKey, stageLeft=0, fadeStack=[]; $wrap[STAGE_FRAME_KEY]=$(div(stageFrameClass)); $wrap[NAV_THUMB_FRAME_KEY]=$(div(navFrameClass + ' ' + navFrameThumbClass + buttonAttributes, div(thumbClass))); $wrap[NAV_DOT_FRAME_KEY]=$(div(navFrameClass + ' ' + navFrameDotClass + buttonAttributes, div(dotClass))); toDeactivate[STAGE_FRAME_KEY]=[]; toDeactivate[NAV_THUMB_FRAME_KEY]=[]; toDeactivate[NAV_DOT_FRAME_KEY]=[]; toDetach[STAGE_FRAME_KEY]={}; $wrap .addClass(CSS3 ? wrapCss3Class:wrapCss2Class) .toggleClass(wrapNoControlsClass, !opts.controlsonstart); fotoramaData.fotorama=this; function checkForVideo (){ $.each(data, function (i, dataFrame){ if(!dataFrame.i){ dataFrame.i=dataFrameCount++; var video=findVideoId(dataFrame.video, true); if(video){ var thumbs={}; dataFrame.video=video; if(!dataFrame.img && !dataFrame.thumb){ thumbs=getVideoThumbs(dataFrame, data, that); }else{ dataFrame.thumbsReady=true; } updateData(data, {img:thumbs.img, thumb:thumbs.thumb}, dataFrame.i, that); }} });} function allowKey (key){ return o_keyboard[key] || that.fullScreen; } function bindGlobalEvents (FLAG){ var keydownCommon='keydown.' + _fotoramaClass, localStamp=_fotoramaClass + stamp, keydownLocal='keydown.' + localStamp, resizeLocal='resize.' + localStamp + ' ' + 'orientationchange.' + localStamp; if(FLAG){ $DOCUMENT .on(keydownLocal, function (e){ var catched, index; if($videoPlaying && e.keyCode===27){ catched=true; unloadVideo($videoPlaying, true, true); } else if(that.fullScreen || (opts.keyboard && !that.index)){ if(e.keyCode===27){ catched=true; that.cancelFullScreen(); } else if((e.shiftKey && e.keyCode===32 && allowKey('space')) || (e.keyCode===37 && allowKey('left')) || (e.keyCode===38 && allowKey('up'))){ index='<'; } else if((e.keyCode===32 && allowKey('space')) || (e.keyCode===39 && allowKey('right')) || (e.keyCode===40 && allowKey('down'))){ index='>'; } else if(e.keyCode===36 && allowKey('home')){ index='<<'; } else if(e.keyCode===35 && allowKey('end')){ index='>>'; }} (catched || index) && stopEvent(e); index && that.show({index:index, slow:e.altKey, user:true});});if(!that.index){ $DOCUMENT .off(keydownCommon) .on(keydownCommon, 'textarea, input, select', function (e){ !$BODY.hasClass(_fullscreenClass) && e.stopPropagation(); });} $WINDOW.on(resizeLocal, that.resize); }else{ $DOCUMENT.off(keydownLocal); $WINDOW.off(resizeLocal); }} function appendElements (FLAG){ if(FLAG===appendElements.f) return; if(FLAG){ $fotorama .html('') .addClass(_fotoramaClass + ' ' + stampClass) .append($wrap) .before($style) .before($anchor); addInstance(that); }else{ $wrap.detach(); $style.detach(); $anchor.detach(); $fotorama .html(fotoramaData.urtext) .removeClass(stampClass); hideInstance(that); } bindGlobalEvents(FLAG); appendElements.f=FLAG; } function setData (){ data=that.data=data || clone(opts.data) || getDataFromHtml($fotorama); size=that.size=data.length; !ready.ok && opts.shuffle && shuffle(data); checkForVideo(); activeIndex=limitIndex(activeIndex); size && appendElements(true); } function stageNoMove (){ var _noMove=(size < 2 && !opts.enableifsingleframe) || $videoPlaying; stageShaftTouchTail.noMove=_noMove || o_fade; stageShaftTouchTail.noSwipe=_noMove || !opts.swipe; !o_transition && $stageShaft.toggleClass(grabClass, !opts.click && !stageShaftTouchTail.noMove && !stageShaftTouchTail.noSwipe); MS_POINTER && $wrap.toggleClass(wrapPanYClass, !stageShaftTouchTail.noSwipe); } function setAutoplayInterval (interval){ if(interval===true) interval=''; opts.autoplay=Math.max(+interval || AUTOPLAY_INTERVAL, o_transitionDuration * 1.5); } function setOptions (){ that.options=opts=optionsToLowerCase(opts); o_fade=(opts.transition==='crossfade' || opts.transition==='dissolve'); o_loop=opts.loop && (size > 2 || (o_fade && (!o_transition || o_transition!=='slide'))); o_transitionDuration=+opts.transitionduration || TRANSITION_DURATION; o_rtl=opts.direction==='rtl'; o_keyboard=$.extend({}, opts.keyboard && KEYBOARD_OPTIONS, opts.keyboard); var classes={add:[], remove:[]}; function addOrRemoveClass (FLAG, value){ classes[FLAG ? 'add':'remove'].push(value); } if(size > 1 || opts.enableifsingleframe){ o_nav=opts.nav; o_navTop=opts.navposition==='top'; classes.remove.push(selectClass); $arrs.toggle(!!opts.arrows); }else{ o_nav=false; $arrs.hide(); } spinnerStop(); spinner=new Spinner($.extend(spinnerDefaults, opts.spinner, spinnerOverride, {direction:o_rtl ? -1:1})); arrsUpdate(); stageWheelUpdate(); if(opts.autoplay) setAutoplayInterval(opts.autoplay); o_thumbSide=numberFromMeasure(opts.thumbwidth) || THUMB_SIZE; o_thumbSide2=numberFromMeasure(opts.thumbheight) || THUMB_SIZE; stageWheelTail.ok=navWheelTail.ok=opts.trackpad && !SLOW; stageNoMove(); extendMeasures(opts, [measures]); o_navThumbs=o_nav==='thumbs'; if(o_navThumbs){ frameDraw(size, 'navThumb'); $navFrame=$navThumbFrame; navFrameKey=NAV_THUMB_FRAME_KEY; setStyle($style, $.Fotorama.jst.style({w:o_thumbSide, h:o_thumbSide2, b:opts.thumbborderwidth, m:opts.thumbmargin, s:stamp, q:!COMPAT})); $nav .addClass(navThumbsClass) .removeClass(navDotsClass); } else if(o_nav==='dots'){ frameDraw(size, 'navDot'); $navFrame=$navDotFrame; navFrameKey=NAV_DOT_FRAME_KEY; $nav .addClass(navDotsClass) .removeClass(navThumbsClass); }else{ o_nav=false; $nav.removeClass(navThumbsClass + ' ' + navDotsClass); } if(o_nav){ if(o_navTop){ $navWrap.insertBefore($stage); }else{ $navWrap.insertAfter($stage); } frameAppend.nav=false; frameAppend($navFrame, $navShaft, 'nav'); } o_allowFullScreen=opts.allowfullscreen; if(o_allowFullScreen){ $fullscreenIcon.prependTo($stage); o_nativeFullScreen=FULLSCREEN && o_allowFullScreen==='native'; }else{ $fullscreenIcon.detach(); o_nativeFullScreen=false; } addOrRemoveClass(o_fade, wrapFadeClass); addOrRemoveClass(!o_fade, wrapSlideClass); addOrRemoveClass(!opts.captions, wrapNoCaptionsClass); addOrRemoveClass(o_rtl, wrapRtlClass); addOrRemoveClass(opts.arrows!=='always', wrapToggleArrowsClass); o_shadows=opts.shadows && !SLOW; addOrRemoveClass(!o_shadows, wrapNoShadowsClass); $wrap .addClass(classes.add.join(' ')) .removeClass(classes.remove.join(' ')); lastOptions=$.extend({}, opts); } function normalizeIndex (index){ return index < 0 ? (size + (index % size)) % size:index >=size ? index % size:index; } function limitIndex (index){ return minMaxLimit(index, 0, size - 1); } function edgeIndex (index){ return o_loop ? normalizeIndex(index):limitIndex(index); } function getPrevIndex (index){ return index > 0 || o_loop ? index - 1:false; } function getNextIndex (index){ return index < size - 1 || o_loop ? index + 1:false; } function setStageShaftMinmaxAndSnap (){ stageShaftTouchTail.min=o_loop ? -Infinity:-getPosByIndex(size - 1, measures.w, opts.margin, repositionIndex); stageShaftTouchTail.max=o_loop ? Infinity:-getPosByIndex(0, measures.w, opts.margin, repositionIndex); stageShaftTouchTail.snap=measures.w + opts.margin; } function setNavShaftMinMax (){ //////console.log('setNavShaftMinMax', measures.nw); navShaftTouchTail.min=Math.min(0, measures.nw - $navShaft.width()); navShaftTouchTail.max=0; $navShaft.toggleClass(grabClass, !(navShaftTouchTail.noMove=navShaftTouchTail.min===navShaftTouchTail.max)); } function eachIndex (indexes, type, fn){ if(typeof indexes==='number'){ indexes=new Array(indexes); var rangeFLAG=true; } return $.each(indexes, function (i, index){ if(rangeFLAG) index=i; if(typeof index==='number'){ var dataFrame=data[normalizeIndex(index)]; if(dataFrame){ var key='$' + type + 'Frame', $frame=dataFrame[key]; fn.call(this, i, index, dataFrame, $frame, key, $frame && $frame.data()); }} });} function setMeasures (width, height, ratio, index){ if(!measuresSetFLAG || (measuresSetFLAG==='*' && index===startIndex)){ ////console.log('setMeasures', index, opts.width, opts.height); width=measureIsValid(opts.width) || measureIsValid(width) || WIDTH; height=measureIsValid(opts.height) || measureIsValid(height) || HEIGHT; that.resize({ width:width, ratio:opts.ratio || ratio || width / height }, 0, index!==startIndex && '*'); }} function loadImg (indexes, type, specialMeasures, method, position, again){ eachIndex(indexes, type, function (i, index, dataFrame, $frame, key, frameData){ if(!$frame) return; var fullFLAG=that.fullScreen && dataFrame.full && dataFrame.full!==dataFrame.img && !frameData.$full && type==='stage'; if(frameData.$img && !again && !fullFLAG) return; var img=new Image(), $img=$(img), imgData=$img.data(); frameData[fullFLAG ? '$full':'$img']=$img; var srcKey=type==='stage' ? (fullFLAG ? 'full':'img'):'thumb', src=dataFrame[srcKey], dummy=fullFLAG ? null:dataFrame[type==='stage' ? 'thumb':'img']; if(type==='navThumb') $frame=frameData.$wrap; function triggerTriggerEvent (event){ var _index=normalizeIndex(index); triggerEvent(event, { index:_index, src:src, frame:data[_index] });} function error (){ $img.remove(); $.Fotorama.cache[src]='error'; if((!dataFrame.html || type!=='stage') && dummy && dummy!==src){ dataFrame[srcKey]=src=dummy; loadImg([index], type, specialMeasures, method, position, true); }else{ if(src && !dataFrame.html && !fullFLAG){ $frame .trigger('f:error') .removeClass(loadingClass) .addClass(errorClass); triggerTriggerEvent('error'); } else if(type==='stage'){ $frame .trigger('f:load') .removeClass(loadingClass + ' ' + errorClass) .addClass(loadedClass); triggerTriggerEvent('load'); setMeasures(); } frameData.state='error'; if(size > 1 && data[index]===dataFrame && !dataFrame.html && !dataFrame.deleted && !dataFrame.video && !fullFLAG){ dataFrame.deleted=true; that.splice(index, 1); }} } function loaded (){ ////console.log('loaded:' + src); //console.log('$.Fotorama.measures[src]', $.Fotorama.measures[src]); $.Fotorama.measures[src]=imgData.measures=$.Fotorama.measures[src] || { width:img.width, height:img.height, ratio:img.width / img.height }; setMeasures(imgData.measures.width, imgData.measures.height, imgData.measures.ratio, index); $img .off('load error') .addClass(imgClass + (fullFLAG ? ' ' + imgFullClass:'')) .prependTo($frame); fit($img, ($.isFunction(specialMeasures) ? specialMeasures():specialMeasures) || measures, method || dataFrame.fit || opts.fit, position || dataFrame.position || opts.position); $.Fotorama.cache[src]=frameData.state='loaded'; setTimeout(function (){ $frame .trigger('f:load') .removeClass(loadingClass + ' ' + errorClass) .addClass(loadedClass + ' ' + (fullFLAG ? loadedFullClass:loadedImgClass)); if(type==='stage'){ triggerTriggerEvent('load'); } else if(dataFrame.thumbratio===AUTO || !dataFrame.thumbratio && opts.thumbratio===AUTO){ dataFrame.thumbratio=imgData.measures.ratio; reset(); }}, 0); } if(!src){ error(); return; } function waitAndLoad (){ var _i=10; waitFor(function (){ return !touchedFLAG || !_i-- && !SLOW; }, function (){ loaded(); });} if(!$.Fotorama.cache[src]){ $.Fotorama.cache[src]='*'; $img .on('load', waitAndLoad) .on('error', error); }else{ (function justWait (){ if($.Fotorama.cache[src]==='error'){ error(); } else if($.Fotorama.cache[src]==='loaded'){ //console.log('take from cache:' + src); setTimeout(waitAndLoad, 0); }else{ setTimeout(justWait, 100); }})(); } frameData.state=''; img.src=src; });} function spinnerSpin ($el){ $spinner.append(spinner.spin().el).appendTo($el); } function spinnerStop (){ $spinner.detach(); spinner && spinner.stop(); } function updateFotoramaState (){ var $frame=activeFrame[STAGE_FRAME_KEY]; if($frame && !$frame.data().state){ spinnerSpin($frame); $frame.on('f:load f:error', function (){ $frame.off('f:load f:error'); spinnerStop(); });}} function addNavFrameEvents (frame){ addEnterUp(frame, onNavFrameClick); addFocus(frame, function (){ setTimeout(function (){ lockScroll($nav); }, 0); slideNavShaft({time:o_transitionDuration, guessIndex:$(this).data().eq, minMax:navShaftTouchTail});});} function frameDraw (indexes, type){ eachIndex(indexes, type, function (i, index, dataFrame, $frame, key, frameData){ if($frame) return; $frame=dataFrame[key]=$wrap[key].clone(); frameData=$frame.data(); frameData.data=dataFrame; var frame=$frame[0]; if(type==='stage'){ if(dataFrame.html){ $('
') .append(dataFrame._html ? $(dataFrame.html) .removeAttr('id') .html(dataFrame._html):dataFrame.html) .appendTo($frame); } dataFrame.caption && $(div(captionClass, div(captionWrapClass, dataFrame.caption))).appendTo($frame); dataFrame.video && $frame .addClass(stageFrameVideoClass) .append($videoPlay.clone()); addFocus(frame, function (){ setTimeout(function (){ lockScroll($stage); }, 0); clickToShow({index:frameData.eq, user:true});});$stageFrame=$stageFrame.add($frame); } else if(type==='navDot'){ addNavFrameEvents(frame); $navDotFrame=$navDotFrame.add($frame); } else if(type==='navThumb'){ addNavFrameEvents(frame); frameData.$wrap=$frame.children(':first'); $navThumbFrame=$navThumbFrame.add($frame); if(dataFrame.video){ frameData.$wrap.append($videoPlay.clone()); }} });} function callFit ($img, measuresToFit, method, position){ return $img && $img.length && fit($img, measuresToFit, method, position); } function stageFramePosition (indexes){ eachIndex(indexes, 'stage', function (i, index, dataFrame, $frame, key, frameData){ if(!$frame) return; var normalizedIndex=normalizeIndex(index), method=dataFrame.fit || opts.fit, position=dataFrame.position || opts.position; frameData.eq=normalizedIndex; toDetach[STAGE_FRAME_KEY][normalizedIndex]=$frame.css($.extend({left:o_fade ? 0:getPosByIndex(index, measures.w, opts.margin, repositionIndex)}, o_fade && getDuration(0))); if(isDetached($frame[0])){ $frame.appendTo($stageShaft); unloadVideo(dataFrame.$video); } callFit(frameData.$img, measures, method, position); callFit(frameData.$full, measures, method, position); });} function thumbsDraw (pos, loadFLAG){ if(o_nav!=='thumbs' || isNaN(pos)) return; var leftLimit=-pos, rightLimit=-pos + measures.nw; $navThumbFrame.each(function (){ var $this=$(this), thisData=$this.data(), eq=thisData.eq, getSpecialMeasures=function (){ return { h:o_thumbSide2, w:thisData.w }}, specialMeasures=getSpecialMeasures(), dataFrame=data[eq] || {}, method=dataFrame.thumbfit || opts.thumbfit, position=dataFrame.thumbposition || opts.thumbposition; specialMeasures.w=thisData.w; if(thisData.l + thisData.w < leftLimit || thisData.l > rightLimit || callFit(thisData.$img, specialMeasures, method, position)) return; loadFLAG && loadImg([eq], 'navThumb', getSpecialMeasures, method, position); });} function frameAppend ($frames, $shaft, type){ if(!frameAppend[type]){ var thumbsFLAG=type==='nav' && o_navThumbs, left=0; $shaft.append($frames .filter(function (){ var actual, $this=$(this), frameData=$this.data(); for (var _i=0, _l=data.length; _i < _l; _i++){ if(frameData.data===data[_i]){ actual=true; frameData.eq=_i; break; }} return actual || $this.remove() && false; }) .sort(function (a, b){ return $(a).data().eq - $(b).data().eq; }) .each(function (){ if(!thumbsFLAG) return; var $this=$(this), frameData=$this.data(), thumbwidth=Math.round(o_thumbSide2 * frameData.data.thumbratio) || o_thumbSide; frameData.l=left; frameData.w=thumbwidth; $this.css({width:thumbwidth});left +=thumbwidth + opts.thumbmargin; })); frameAppend[type]=true; }} function getDirection (x){ return x - stageLeft > measures.w / 3; } function disableDirrection (i){ return !o_loop && (!(activeIndex + i) || !(activeIndex - size + i)) && !$videoPlaying; } function arrsUpdate (){ var disablePrev=disableDirrection(0), disableNext=disableDirrection(1); $arrPrev .toggleClass(arrDisabledClass, disablePrev) .attr(disableAttr(disablePrev)); $arrNext .toggleClass(arrDisabledClass, disableNext) .attr(disableAttr(disableNext)); } function stageWheelUpdate (){ if(stageWheelTail.ok){ stageWheelTail.prevent={'<':disableDirrection(0), '>':disableDirrection(1)};}} function getNavFrameBounds ($navFrame){ var navFrameData=$navFrame.data(), left, width; if(o_navThumbs){ left=navFrameData.l; width=navFrameData.w; }else{ left=$navFrame.position().left; width=$navFrame.width(); } return { c:left + width / 2, min:-left + opts.thumbmargin * 10, max:-left + measures.w - width - opts.thumbmargin * 10 };} function slideThumbBorder (time){ var navFrameData=activeFrame[navFrameKey].data(); slide($thumbBorder, { time:time * 1.2, pos:navFrameData.l, width:navFrameData.w - opts.thumbborderwidth * 2 });} function slideNavShaft (options){ //console.log('slideNavShaft', options.guessIndex, options.keep, slideNavShaft.l); var $guessNavFrame=data[options.guessIndex][navFrameKey]; if($guessNavFrame){ var overflowFLAG=navShaftTouchTail.min!==navShaftTouchTail.max, minMax=options.minMax || overflowFLAG && getNavFrameBounds(activeFrame[navFrameKey]), l=overflowFLAG && (options.keep && slideNavShaft.l ? slideNavShaft.l:minMaxLimit((options.coo || measures.nw / 2) - getNavFrameBounds($guessNavFrame).c, minMax.min, minMax.max)), pos=overflowFLAG && minMaxLimit(l, navShaftTouchTail.min, navShaftTouchTail.max), time=options.time * 1.1; slide($navShaft, { time:time, pos:pos || 0, onEnd:function (){ thumbsDraw(pos, true); }});setShadow($nav, findShadowEdge(pos, navShaftTouchTail.min, navShaftTouchTail.max)); slideNavShaft.l=l; }} function navUpdate (){ deactivateFrames(navFrameKey); toDeactivate[navFrameKey].push(activeFrame[navFrameKey].addClass(activeClass)); } function deactivateFrames (key){ var _toDeactivate=toDeactivate[key]; while (_toDeactivate.length){ _toDeactivate.shift().removeClass(activeClass); }} function detachFrames (key){ var _toDetach=toDetach[key]; ////console.log('_toDetach', _toDetach); ////console.log('activeIndexes', activeIndexes); $.each(activeIndexes, function (i, index){ delete _toDetach[normalizeIndex(index)]; });$.each(_toDetach, function (index, $frame){ delete _toDetach[index]; ////console.log('Detach', index); $frame.detach(); });} function stageShaftReposition (skipOnEnd){ repositionIndex=dirtyIndex=activeIndex; var $frame=activeFrame[STAGE_FRAME_KEY]; if($frame){ deactivateFrames(STAGE_FRAME_KEY); toDeactivate[STAGE_FRAME_KEY].push($frame.addClass(activeClass)); skipOnEnd || that.show.onEnd(true); stop($stageShaft, 0, true); detachFrames(STAGE_FRAME_KEY); stageFramePosition(activeIndexes); setStageShaftMinmaxAndSnap(); setNavShaftMinMax(); }} function extendMeasures (options, measuresArray){ if(!options) return; $.each(measuresArray, function (i, measures){ if(!measures) return; $.extend(measures, { width:options.width || measures.width, height:options.height, minwidth:options.minwidth, maxwidth:options.maxwidth, minheight:options.minheight, maxheight:options.maxheight, ratio:getRatio(options.ratio) }) });} function triggerEvent (event, extra){ $fotorama.trigger(_fotoramaClass + ':' + event, [that, extra]); } function onTouchStart (){ clearTimeout(onTouchEnd.t); touchedFLAG=1; if(opts.stopautoplayontouch){ that.stopAutoplay(); }else{ pausedAutoplayFLAG=true; }} function onTouchEnd (){ if(!touchedFLAG) return; if(!opts.stopautoplayontouch){ releaseAutoplay(); changeAutoplay(); } onTouchEnd.t=setTimeout(function (){ touchedFLAG=0; }, TRANSITION_DURATION + TOUCH_TIMEOUT); ////console.timeEnd('onTouchEnd'); } function releaseAutoplay (){ //console.log('releaseAutoplay'); pausedAutoplayFLAG=!!($videoPlaying || stoppedAutoplayFLAG); } function changeAutoplay (){ //console.log('changeAutoplay'); clearTimeout(changeAutoplay.t); waitFor.stop(changeAutoplay.w); if(!opts.autoplay || pausedAutoplayFLAG){ if(that.autoplay){ that.autoplay=false; triggerEvent('stopautoplay'); } return; } //console.log('changeAutoplay continue'); if(!that.autoplay){ that.autoplay=true; triggerEvent('startautoplay'); } var _activeIndex=activeIndex; var frameData=activeFrame[STAGE_FRAME_KEY].data(); changeAutoplay.w=waitFor(function (){ //console.log('wait for the state of the current frame'); return frameData.state || _activeIndex!==activeIndex; }, function (){ //console.log('the current frame is ready'); changeAutoplay.t=setTimeout(function (){ //console.log('changeAutoplay.t setTimeout', pausedAutoplayFLAG, _activeIndex!==activeIndex); if(pausedAutoplayFLAG || _activeIndex!==activeIndex) return; var _nextAutoplayIndex=nextAutoplayIndex, nextFrameData=data[_nextAutoplayIndex][STAGE_FRAME_KEY].data(); changeAutoplay.w=waitFor(function (){ //console.log('wait for the state of the next frame'); return nextFrameData.state || _nextAutoplayIndex!==nextAutoplayIndex; }, function (){ if(pausedAutoplayFLAG || _nextAutoplayIndex!==nextAutoplayIndex) return; that.show(o_loop ? getDirectionSign(!o_rtl):nextAutoplayIndex); });}, opts.autoplay); });} that.startAutoplay=function (interval){ if(that.autoplay) return this; pausedAutoplayFLAG=stoppedAutoplayFLAG=false; setAutoplayInterval(interval || opts.autoplay); changeAutoplay(); return this; }; that.stopAutoplay=function (){ if(that.autoplay){ pausedAutoplayFLAG=stoppedAutoplayFLAG=true; changeAutoplay(); } return this; }; that.show=function (options){ //console.log('that.show'); ////console.time('that.show prepare'); var index; if(typeof options!=='object'){ index=options; options={};}else{ index=options.index; } index=index==='>' ? dirtyIndex + 1:index==='<' ? dirtyIndex - 1:index==='<<' ? 0:index==='>>' ? size - 1:index; index=isNaN(index) ? getIndexFromHash(index, data, true):index; index=typeof index==='undefined' ? activeIndex || 0:index; that.activeIndex=activeIndex=edgeIndex(index); prevIndex=getPrevIndex(activeIndex); nextIndex=getNextIndex(activeIndex); nextAutoplayIndex=normalizeIndex(activeIndex + (o_rtl ? -1:1)); activeIndexes=[activeIndex, prevIndex, nextIndex]; dirtyIndex=o_loop ? index:activeIndex; var diffIndex=Math.abs(lastActiveIndex - dirtyIndex), time=getNumber(options.time, function (){ return Math.min(o_transitionDuration * (1 + (diffIndex - 1) / 12), o_transitionDuration * 2); }), overPos=options.overPos; if(options.slow) time *=10; var _activeFrame=activeFrame; that.activeFrame=activeFrame=data[activeIndex]; ////console.timeEnd('that.show prepare'); var silent=_activeFrame===activeFrame && !options.user; ////console.time('unloadVideo'); unloadVideo($videoPlaying, activeFrame.i!==data[normalizeIndex(repositionIndex)].i); ////console.timeEnd('unloadVideo'); ////console.time('frameDraw'); frameDraw(activeIndexes, 'stage'); ////console.timeEnd('frameDraw'); ////console.time('stageFramePosition'); stageFramePosition(SLOW ? [dirtyIndex]:[dirtyIndex, getPrevIndex(dirtyIndex), getNextIndex(dirtyIndex)]); ////console.timeEnd('stageFramePosition'); ////console.time('updateTouchTails'); updateTouchTails('go', true); ////console.timeEnd('updateTouchTails'); ////console.time('triggerEvent'); silent || triggerEvent('show', { user:options.user, time:time });////console.timeEnd('triggerEvent'); ////console.time('bind onEnd'); pausedAutoplayFLAG=true; var onEnd=that.show.onEnd=function (skipReposition){ if(onEnd.ok) return; onEnd.ok=true; skipReposition || stageShaftReposition(true); if(!silent){ triggerEvent('showend', { user:options.user });} //console.log('o_transition', o_transition); if(!skipReposition && o_transition && o_transition!==opts.transition){ //console.log('set transition back to:' + o_transition); that.setOptions({transition:o_transition});o_transition=false; return; } updateFotoramaState(); loadImg(activeIndexes, 'stage'); updateTouchTails('go', false); stageWheelUpdate(); stageCursor(); releaseAutoplay(); changeAutoplay(); }; ////console.timeEnd('bind onEnd'); if(!o_fade){ ////console.time('slide'); slide($stageShaft, { pos:-getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex), overPos:overPos, time:time, onEnd:onEnd });////console.timeEnd('slide'); }else{ var $activeFrame=activeFrame[STAGE_FRAME_KEY], $prevActiveFrame=activeIndex!==lastActiveIndex ? data[lastActiveIndex][STAGE_FRAME_KEY]:null; fade($activeFrame, $prevActiveFrame, $stageFrame, { time:time, method:opts.transition, onEnd:onEnd }, fadeStack); } ////console.time('arrsUpdate'); arrsUpdate(); ////console.timeEnd('arrsUpdate'); if(o_nav){ ////console.time('navUpdate'); navUpdate(); ////console.timeEnd('navUpdate'); ////console.time('slideNavShaft'); var guessIndex=limitIndex(activeIndex + minMaxLimit(dirtyIndex - lastActiveIndex, -1, 1)); slideNavShaft({time:time, coo:guessIndex!==activeIndex && options.coo, guessIndex:typeof options.coo!=='undefined' ? guessIndex:activeIndex, keep:silent});////console.timeEnd('slideNavShaft'); ////console.time('slideThumbBorder'); if(o_navThumbs) slideThumbBorder(time); ////console.timeEnd('slideThumbBorder'); } ////console.time('that.show end'); showedFLAG=typeof lastActiveIndex!=='undefined' && lastActiveIndex!==activeIndex; lastActiveIndex=activeIndex; opts.hash && showedFLAG && !that.eq && setHash(activeFrame.id || activeIndex + 1); ////console.timeEnd('that.show end'); ////console.timeEnd('that.show'); return this; }; that.requestFullScreen=function (){ if(o_allowFullScreen && !that.fullScreen){ scrollTop=$WINDOW.scrollTop(); scrollLeft=$WINDOW.scrollLeft(); lockScroll($WINDOW); updateTouchTails('x', true); measuresStash=$.extend({}, measures); $fotorama .addClass(fullscreenClass) .appendTo($BODY.addClass(_fullscreenClass)); $HTML.addClass(_fullscreenClass); unloadVideo($videoPlaying, true, true); that.fullScreen=true; if(o_nativeFullScreen){ fullScreenApi.request(fotorama); } that.resize(); loadImg(activeIndexes, 'stage'); updateFotoramaState(); triggerEvent('fullscreenenter'); } return this; }; function cancelFullScreen (){ if(that.fullScreen){ that.fullScreen=false; if(FULLSCREEN){ fullScreenApi.cancel(fotorama); } $BODY.removeClass(_fullscreenClass); $HTML.removeClass(_fullscreenClass); $fotorama .removeClass(fullscreenClass) .insertAfter($anchor); measures=$.extend({}, measuresStash); unloadVideo($videoPlaying, true, true); updateTouchTails('x', false); that.resize(); loadImg(activeIndexes, 'stage'); lockScroll($WINDOW, scrollLeft, scrollTop); triggerEvent('fullscreenexit'); }} that.cancelFullScreen=function (){ if(o_nativeFullScreen && fullScreenApi.is()){ fullScreenApi.cancel(document); }else{ cancelFullScreen(); } return this; }; that.toggleFullScreen=function (){ return that[(that.fullScreen ? 'cancel':'request') + 'FullScreen'](); }; addEvent(document, fullScreenApi.event, function (){ if(data && !fullScreenApi.is() && !$videoPlaying){ cancelFullScreen(); }});that.resize=function (options){ if(!data) return this; var time=arguments[1] || 0, setFLAG=arguments[2]; extendMeasures(!that.fullScreen ? optionsToLowerCase(options):{width:'100%', maxwidth:null, minwidth:null, height:'100%', maxheight:null, minheight:null}, [measures, setFLAG || that.fullScreen || opts]); var width=measures.width, height=measures.height, ratio=measures.ratio, windowHeight=$WINDOW.height() - (o_nav ? $nav.height():0); if(measureIsValid(width)){ $wrap .addClass(wrapOnlyActiveClass) .css({width:width, minWidth:measures.minwidth || 0, maxWidth:measures.maxwidth || MAX_WIDTH});width=measures.W=measures.w=$wrap.width(); measures.nw=o_nav && numberFromWhatever(opts.navwidth, width) || width; if(opts.glimpse){ measures.w -=Math.round((numberFromWhatever(opts.glimpse, width) || 0) * 2); } $stageShaft.css({width:measures.w, marginLeft:(measures.W - measures.w) / 2});////console.log('measures.W', measures.W); ////console.log('measures.w', measures.w); height=numberFromWhatever(height, windowHeight); height=height || (ratio && width / ratio); if(height){ width=Math.round(width); height=measures.h=Math.round(minMaxLimit(height, numberFromWhatever(measures.minheight, windowHeight), numberFromWhatever(measures.maxheight, windowHeight))); $stage .stop() .animate({width:width, height:height}, time, function (){ $wrap.removeClass(wrapOnlyActiveClass); });stageShaftReposition(); if(o_nav){ $nav .stop() .animate({width:measures.nw}, time); slideNavShaft({guessIndex:activeIndex, time:time, keep:true});if(o_navThumbs && frameAppend.nav) slideThumbBorder(time); } measuresSetFLAG=setFLAG || true; ready(); }} stageLeft=$stage.offset().left; return this; }; that.setOptions=function (options){ $.extend(opts, options); reset(); return this; }; that.shuffle=function (){ data && shuffle(data) && reset(); return this; }; function setShadow ($el, edge){ ////console.time('setShadow'); if(o_shadows){ $el.removeClass(shadowsLeftClass + ' ' + shadowsRightClass); edge && !$videoPlaying && $el.addClass(edge.replace(/^|\s/g, ' ' + shadowsClass + '--')); } ////console.timeEnd('setShadow'); } that.destroy=function (){ that.cancelFullScreen(); that.stopAutoplay(); data=that.data=null; appendElements(); activeIndexes=[]; detachFrames(STAGE_FRAME_KEY); reset.ok=false; return this; }; that.playVideo=function (){ var dataFrame=activeFrame, video=dataFrame.video, _activeIndex=activeIndex; if(typeof video==='object' && dataFrame.videoReady){ o_nativeFullScreen && that.fullScreen && that.cancelFullScreen(); waitFor(function (){ return !fullScreenApi.is() || _activeIndex!==activeIndex; }, function (){ if(_activeIndex===activeIndex){ dataFrame.$video=dataFrame.$video || $($.Fotorama.jst.video(video)); dataFrame.$video.appendTo(dataFrame[STAGE_FRAME_KEY]); $wrap.addClass(wrapVideoClass); $videoPlaying=dataFrame.$video; stageNoMove(); $arrs.blur(); $fullscreenIcon.blur(); triggerEvent('loadvideo'); }});} return this; }; that.stopVideo=function (){ unloadVideo($videoPlaying, true, true); return this; }; function unloadVideo ($video, unloadActiveFLAG, releaseAutoplayFLAG){ if(unloadActiveFLAG){ $wrap.removeClass(wrapVideoClass); $videoPlaying=false; stageNoMove(); } if($video && $video!==$videoPlaying){ $video.remove(); triggerEvent('unloadvideo'); } if(releaseAutoplayFLAG){ releaseAutoplay(); changeAutoplay(); }} function toggleControlsClass (FLAG){ $wrap.toggleClass(wrapNoControlsClass, FLAG); } function stageCursor (e){ if(stageShaftTouchTail.flow) return; var x=e ? e.pageX:stageCursor.x, pointerFLAG=x && !disableDirrection(getDirection(x)) && opts.click; if(stageCursor.p!==pointerFLAG && $stage.toggleClass(pointerClass, pointerFLAG)){ stageCursor.p=pointerFLAG; stageCursor.x=x; }} $stage.on('mousemove', stageCursor); function clickToShow (showOptions){ clearTimeout(clickToShow.t); if(opts.clicktransition && opts.clicktransition!==opts.transition){ //console.log('change transition to:' + opts.clicktransition); setTimeout(function (){ var _o_transition=opts.transition; that.setOptions({transition:opts.clicktransition});o_transition=_o_transition; clickToShow.t=setTimeout(function (){ that.show(showOptions); }, 10); }, 0); }else{ that.show(showOptions); }} function onStageTap (e, toggleControlsFLAG){ ////console.time('onStageTap'); var target=e.target, $target=$(target); if($target.hasClass(videoPlayClass)){ that.playVideo(); } else if(target===fullscreenIcon){ that.toggleFullScreen(); } else if($videoPlaying){ target===videoClose && unloadVideo($videoPlaying, true, true); }else{ if(toggleControlsFLAG){ toggleControlsClass(); } else if(opts.click){ clickToShow({index:e.shiftKey || getDirectionSign(getDirection(e._x)), slow:e.altKey, user:true});}} ////console.timeEnd('onStageTap'); } function updateTouchTails (key, value){ stageShaftTouchTail[key]=navShaftTouchTail[key]=value; } stageShaftTouchTail=moveOnTouch($stageShaft, { onStart:onTouchStart, onMove:function (e, result){ setShadow($stage, result.edge); }, onTouchEnd:onTouchEnd, onEnd:function (result){ ////console.time('stageShaftTouchTail.onEnd'); setShadow($stage); ////console.log('result', result); var toggleControlsFLAG=(MS_POINTER && !hoverFLAG || result.touch) && opts.arrows && opts.arrows!=='always'; if(result.moved || (toggleControlsFLAG && result.pos!==result.newPos && !result.control)){ var index=getIndexByPos(result.newPos, measures.w, opts.margin, repositionIndex); that.show({ index:index, time:o_fade ? o_transitionDuration:result.time, overPos:result.overPos, user:true });} else if(!result.aborted && !result.control){ onStageTap(result.startEvent, toggleControlsFLAG); } ////console.timeEnd('stageShaftTouchTail.onEnd'); }, timeLow:1, timeHigh:1, friction:2, select:'.' + selectClass + ', .' + selectClass + ' *', $wrap:$stage });navShaftTouchTail=moveOnTouch($navShaft, { onStart:onTouchStart, onMove:function (e, result){ setShadow($nav, result.edge); }, onTouchEnd:onTouchEnd, onEnd:function (result){ function onEnd (){ slideNavShaft.l=result.newPos; releaseAutoplay(); changeAutoplay(); thumbsDraw(result.newPos, true); } if(!result.moved){ var target=result.$target.closest('.' + navFrameClass, $navShaft)[0]; target && onNavFrameClick.call(target, result.startEvent); } else if(result.pos!==result.newPos){ pausedAutoplayFLAG=true; slide($navShaft, { time:result.time, pos:result.newPos, overPos:result.overPos, onEnd:onEnd });thumbsDraw(result.newPos); o_shadows && setShadow($nav, findShadowEdge(result.newPos, navShaftTouchTail.min, navShaftTouchTail.max)); }else{ onEnd(); }}, timeLow:.5, timeHigh:2, friction:5, $wrap:$nav });stageWheelTail=wheel($stage, { shift:true, onEnd:function (e, direction){ ////console.log('wheel $stage onEnd', direction); onTouchStart(); onTouchEnd(); that.show({index:direction, slow:e.altKey}) }});navWheelTail=wheel($nav, { onEnd:function (e, direction){ ////console.log('wheel $nav onEnd', direction); onTouchStart(); onTouchEnd(); var newPos=stop($navShaft) + direction * .25; $navShaft.css(getTranslate(minMaxLimit(newPos, navShaftTouchTail.min, navShaftTouchTail.max))); o_shadows && setShadow($nav, findShadowEdge(newPos, navShaftTouchTail.min, navShaftTouchTail.max)); navWheelTail.prevent={'<':newPos >=navShaftTouchTail.max, '>':newPos <=navShaftTouchTail.min}; clearTimeout(navWheelTail.t); navWheelTail.t=setTimeout(function (){ slideNavShaft.l=newPos; thumbsDraw(newPos, true) }, TOUCH_TIMEOUT); thumbsDraw(newPos); }});$wrap.hover(function (){ setTimeout(function (){ if(touchedFLAG) return; toggleControlsClass(!(hoverFLAG=true)); }, 0); }, function (){ if(!hoverFLAG) return; toggleControlsClass(!(hoverFLAG=false)); }); function onNavFrameClick (e){ var index=$(this).data().eq; clickToShow({index:index, slow:e.altKey, user:true, coo:e._x - $nav.offset().left});} function onArrClick (e){ clickToShow({index:$arrs.index(this) ? '>':'<', slow:e.altKey, user:true});} smartClick($arrs, function (e){ stopEvent(e); onArrClick.call(this, e); }, { onStart:function (){ onTouchStart(); stageShaftTouchTail.control=true; }, onTouchEnd:onTouchEnd });function addFocusOnControls (el){ addFocus(el, function (){ setTimeout(function (){ lockScroll($stage); }, 0); toggleControlsClass(false); });} $arrs.each(function (){ addEnterUp(this, function (e){ onArrClick.call(this, e); });addFocusOnControls(this); });addEnterUp(fullscreenIcon, that.toggleFullScreen); addFocusOnControls(fullscreenIcon); function reset (){ setData(); setOptions(); if(!reset.i){ reset.i=true; var _startindex=opts.startindex; if(_startindex || opts.hash && location.hash){ startIndex=getIndexFromHash(_startindex || location.hash.replace(/^#/, ''), data, that.index===0 || _startindex, _startindex); } activeIndex=repositionIndex=dirtyIndex=lastActiveIndex=startIndex=edgeIndex(startIndex) || 0; } if(size){ if(changeToRtl()) return; if($videoPlaying){ unloadVideo($videoPlaying, true); } activeIndexes=[]; detachFrames(STAGE_FRAME_KEY); reset.ok=true; that.show({index:activeIndex, time:0});that.resize(); }else{ that.destroy(); }} function changeToRtl (){ ////console.log('changeToRtl'); if(!changeToRtl.f===o_rtl){ changeToRtl.f=o_rtl; activeIndex=size - 1 - activeIndex; ////console.log('changeToRtl execute, activeIndex is', activeIndex); that.reverse(); return true; }} $.each('load push pop shift unshift reverse sort splice'.split(' '), function (i, method){ that[method]=function (){ data=data || []; if(method!=='load'){ Array.prototype[method].apply(data, arguments); } else if(arguments[0] && typeof arguments[0]==='object' && arguments[0].length){ data=clone(arguments[0]); } reset(); return that; }});function ready (){ if(!ready.ok){ ready.ok=true; triggerEvent('ready'); }} reset(); }; $.fn.fotorama=function (opts){ return this.each(function (){ var that=this, $fotorama=$(this), fotoramaData=$fotorama.data(), fotorama=fotoramaData.fotorama; if(!fotorama){ waitFor(function (){ return !isHidden(that); }, function (){ fotoramaData.urtext=$fotorama.html(); new $.Fotorama($fotorama, $.extend({}, OPTIONS, window.fotoramaDefaults, opts, fotoramaData)); });}else{ fotorama.setOptions(opts, true); }});}; $.Fotorama.instances=[]; function calculateIndexes (){ $.each($.Fotorama.instances, function (index, instance){ instance.index=index; });} function addInstance (instance){ $.Fotorama.instances.push(instance); calculateIndexes(); } function hideInstance (instance){ $.Fotorama.instances.splice(instance.index, 1); calculateIndexes(); } $.Fotorama.cache={}; $.Fotorama.measures={}; $=$ || {}; $.Fotorama=$.Fotorama || {}; $.Fotorama.jst=$.Fotorama.jst || {}; $.Fotorama.jst.style=function(v){ var __t, __p='', __e=_.escape; __p +='.fotorama' + ((__t=(v.s))==null ? '':__t) + ' .fotorama__nav--thumbs .fotorama__nav__frame{\npadding:' + ((__t=(v.m))==null ? '':__t) + 'px;\nheight:' + ((__t=(v.h))==null ? '':__t) + 'px}\n.fotorama' + ((__t=(v.s))==null ? '':__t) + ' .fotorama__thumb-border{\nheight:' + ((__t=(v.h - v.b * (v.q ? 0:2)))==null ? '':__t) + 'px;\nborder-width:' + ((__t=(v.b))==null ? '':__t) + 'px;\nmargin-top:' + ((__t=(v.m))==null ? '':__t) + 'px}'; return __p }; $.Fotorama.jst.video=function(v){ var __t, __p='', __e=_.escape, __j=Array.prototype.join; function print(){ __p +=__j.call(arguments, '') } __p +='
\n'; return __p }; $(function (){ $('.' + _fotoramaClass + ':not([data-auto="false"])').fotorama(); });})(window, document, location, typeof jQuery!=='undefined' && jQuery);